package funcionesDeMutacion;

import java.util.ArrayList;
import util.Aleatorio;

import cromosomas.Arbol;
import cromosomas.CromosomaEstrategia;
import cromosomas.CromosomaEstrategia.Tipo;
import elementosEvolutivos.Cromosoma;
import elementosEvolutivos.FuncMutacion;

public class MutacionDeTerminal implements FuncMutacion {

	@Override
	public void mutar(Cromosoma cr) {
		CromosomaEstrategia cre = (CromosomaEstrategia)cr;
		ArrayList<Arbol> terminales = obtenerTerminales(cre.getArbol());
		int pos = Aleatorio.getIntAleatorio(terminales.size());
		Tipo t = terminales.get(pos).getTipo();
		Tipo newt = t;
		while(t.equals(newt)){
			newt = Tipo.values()[Aleatorio.getIntAleatorio(3)];
		}
		terminales.get(pos).setTipo(newt);
	}
	
	private ArrayList<Arbol> obtenerTerminales(Arbol ar){
		ArrayList <Arbol> listaTerminales = new ArrayList<Arbol>();
		if(ar.isTerminal())
			listaTerminales.add(ar);
		for(int i=0; i<ar.getNum_hijos(); i++)
			listaTerminales.addAll(obtenerTerminales(ar.getHijos()[i]));
		return listaTerminales;
	}

}
